import { history } from 'umi'
import { useEffect, useState } from 'react'
import styles from './index.module.less'
import { getLocalStorage, setLocalStorage } from '@/storage'
import { fetchUserInfo, fetchUserInfoBySecret } from './api'
import { Checkbox, Toast } from 'antd-mobile'
import type { QueryParams, ReportType } from './interface'
import type { LoginInfo } from '@/pages/login/interface'
import { initWxShare } from '@/utils/wechatHelper'

/** 更新分享链接中的Secret */
const updateShareSecret = (secret: string) => {
    setLocalStorage('SHARE_SECRET', secret)
    initWxShare()
}

export const ReportEntry = () => {
    const { token, secret, source, site, mysecret } = (history.location.query as any) as QueryParams

    /** 是否同意隐私协议 */
    const [allowPrivacy, setAllowPrivacy] = useState<boolean>(false)

    /** 获取要查看的报告类型（自己/他人） */
    const getReportType = (): ReportType => {
        if (['friendcircle', 'web_pc', 'url'].includes(source ?? '')) {
            return 'other'
        }
        return 'mine'
    }

    /** 是否需要同意隐私协议 */
    const shouldAllowPrivacy = getReportType() === 'mine' || source === 'web_pc'

    /** 根据角色跳转到不同的报告页面 */
    const onSwitchReport = () => {
        const role = getLocalStorage('ROLE_INFO')
        if (!role) {
            history.push({ pathname: '/login' })
            return
        }

        if (shouldAllowPrivacy && !allowPrivacy) {
            Toast.show('请先同意隐私协议')
            return
        }

        let type: ReportType = getReportType()

        switch (role) {
            // 主管部门
            case 'province':
            case 'city':
            case 'area':
                history.push({ pathname: '/report/department', query: { type } })
                break

            // 培训机构
            case 'trainer':
                history.push({ pathname: '/report/trainer', query: { type } })
                break

            // 培训讲师
            case 'teacher':
                history.push({ pathname: '/report/teacher', query: { type } })
                break

            // 学员或其他角色
            default:
                history.push({ pathname: '/report/nodata', query: { type: 'student' } })
                break
        }
    }

    useEffect(() => {
        if (!site) return
        // 因为 token 是区分站点的
        // 所以，当url中有token时更新site_domain更新为传递进来的site
        // 或，缓存没有site_domain信息时更新为传递进来的site
        if (!token && getLocalStorage('SITE_DOMAIN')) return

        setLocalStorage('SITE_DOMAIN', site)
    }, [site, token])

    useEffect(() => {
        if (!mysecret) return

        const loginInfo = { secret: mysecret } as LoginInfo
        setLocalStorage('LOGIN_INFO', loginInfo)

        // 更新分享链接中的secret为自己的secret
        updateShareSecret(mysecret)
    }, [mysecret])

    useEffect(() => {
        if (!secret) return

        setLocalStorage('SECRET_CODE', secret)
        // 更新分享链接中的secret为分享者的secret
        updateShareSecret(secret)

        // 通过 secret 获取用户角色
        const updateRoleInfo = async () => {
            const { data } = await fetchUserInfoBySecret(secret)
            setLocalStorage('ROLE_INFO', data?.role_code)
        }

        updateRoleInfo()
    }, [secret])

    useEffect(() => {
        if (token) {
            setLocalStorage('ACCESS_TOKEN', token)
        }

        const updateUserInfo = async () => {
            const { data } = await fetchUserInfo()
            setLocalStorage('ROLE_INFO', data?.roles?.[0] ?? '')

            // 更新分享链接中的secret为自己的secret
            const loginInfo = getLocalStorage('LOGIN_INFO') as LoginInfo
            loginInfo?.secret && updateShareSecret(loginInfo?.secret)
        }

        if (
            // 路由只携带 token 时根据 token 更新用户角色信息
            (token && !secret) ||
            // 路由即没有携带 token 也没有 secret 表示已登录状态进入报告入口
            (!token && !secret)
        ) {
            updateUserInfo()
        }
    }, [token, secret])

    return (
        <div className={styles.page}>
            <div className={styles.bigStuff} />

            <div className={styles.smallStuff} />

            <div className={styles.page_bottom}>
                <div className={styles.openBtn} onClick={onSwitchReport} />

                {shouldAllowPrivacy && (
                    <div className={styles.privacy}>
                        <Checkbox
                            style={{ color: '#FFF', '--font-size': '14px' }}
                            checked={allowPrivacy}
                            onChange={e => {
                                setAllowPrivacy(e)
                            }}
                        >
                            同意平台查询并统计我的历史数据
                        </Checkbox>
                    </div>
                )}

                <div className={styles.tips}>
                    <p>*数据统计周期截至2024年12月31日</p>
                    <p>数据来源：杭州沃土教育科技股份有限公司</p>
                </div>
            </div>
        </div>
    )
}

export default ReportEntry
